package com.xj.algorithm.leetcode;

/**
 * 有效的完全平方数
 */
public class L367_判断一个数是完全平方数 {

    /**
     * 给定一个正整数 num，编写一个函数，如果 num 是一个完全平方数，则返回 True，否则返回 False。
     *
     * 说明：不要使用任何内置的库函数，如  sqrt。
     *
     * 示例 1：
     *
     * 输入：16
     * 输出：True
     * 示例 2：
     *
     * 输入：14
     * 输出：False
     */
    public static void main(String[] args) {
        System.out.println(isPerfectSquareOffice(16));
        System.out.println(isPerfectSquareOffice(14));
    }

    //自己的解法：暴力循环,注意可能数字越界
    public static boolean isPerfectSquare(int num) {
        for (int i=1;i<=num;i++){
            if((double)num/i==i){
                return true;
            }else if((double)num/i<i){
                return false;
            }
        }
        return false;
    }

    //官方解法：牛顿迭代法,切线
    public static boolean isPerfectSquareOffice(int num) {
        if (num < 2) return true;

        long x = num / 2;
        while (x * x > num) {
            x = (x + num / x) / 2;
        }
        return (x * x == num);
    }

    //精彩解法：二分法
    public static boolean isPerfectSquareGood(int num) {
        if (num < 2) {
            return true;
        }

        long left = 2, right = num / 2, x, guessSquared;
        while (left <= right) {
            x = left + (right - left) / 2;
            guessSquared = x * x;
            if (guessSquared == num) {
                return true;
            }
            if (guessSquared > num) {
                right = x - 1;
            } else {
                left = x + 1;
            }
        }
        return false;
    }
}
